package com.cheng.example.excel.easyexcel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Data
public class PayDemoListener<T> extends AnalysisEventListener<T> {
    private static final Logger LOGGER = LoggerFactory.getLogger(PayDemoListener.class);


    /**
     * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 10000;
    private List<T> list = new ArrayList<>();


    private Map<Integer, String> headMap;


    private List<Map<Object, Object>> mapArrayList= new ArrayList<>();
    /**
     * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    public PayDemoListener() {
    }


    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(T data, AnalysisContext context) {

//        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));

//        Map<Object, Object> cellDataMap = new LinkedHashMap<>();
//
//        Class<?> clz = data.getClass();
//        // 获取实体类的所有属性，返回Field数组
//        Field[] fields = clz.getDeclaredFields();
//        for (Field field : fields) {// --for() begin
//
//            try {
//                field.setAccessible(true);
//                if (field.get(data) != null) {
//                    cellDataMap.put(toUpperCaseFirstOne(field.getName()), field.get(data));
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//
//        Object obj = null;
//        for(Map.Entry entry:cellDataMap.entrySet()){
//            if (entry.getKey().equals("CashValue")) {
//                System.out.println();
//            }
//            CellData cellData = (CellData) entry.getValue();
//            if (cellData.getType() == CellDataTypeEnum.NUMBER) {
//                NumberFormat numberFormat = NumberFormat.getInstance();
//                numberFormat.setMaximumFractionDigits(12);//小数点后保留几位
//                numberFormat.setGroupingUsed(false);//解决大于1000 的数时，有逗号问题
//                obj = numberFormat.format(cellData.getNumberValue());
//            } else if (cellData.getType() == CellDataTypeEnum.STRING) {
//                obj = String.valueOf(cellData.getStringValue());
//            } else if (cellData.getType() == CellDataTypeEnum.BOOLEAN) {
//                obj = Boolean.valueOf(cellData.getBooleanValue());
//            } else if (cellData.getType() == CellDataTypeEnum.EMPTY) {
//                obj = Boolean.valueOf(cellData.getBooleanValue());
//            } else {
//                obj = "";
//            }
//
//            if (obj instanceof String) {
//                String str = (String) obj;
//                str = StringUtils.replace(str, "　", "").trim();
//                obj = str;
//            }
//
//            cellDataMap.put(entry.getKey(), obj);
//        }
//
//        mapArrayList.add(cellDataMap);
        list.add(data);
    }

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        this.headMap = headMap;
        System.out.println(headMap);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
//        saveData();
        LOGGER.info("所有数据解析完成！");
    }

    /**
     * 加上存储数据库
     */
//    private void saveData() {
////        LOGGER.info("{}条数据，开始存储数据库！", list.size());
//////        demoDAO.save(list);
////        LOGGER.info("存储数据库成功！");
//    }


    //首字母转大写
    public static String toUpperCaseFirstOne(String s){
        if(Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }
}
